home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_100 / 181_01 / where.c < prev    next >
Text File  |  1985-12-11  |  39KB  |  776 lines

  1. /****************************************************************************
  2. *                                WHERE                                      *
  3. *                                                                           *
  4. *  WHERE is a program to locate files on a disk.  It requires DOS 2.x or    *
  5. *  above.  It will search through all subdirectories of the disk looking    *
  6. *  for files which match information coming from the command line.          *
  7. *                                                                           *
  8. *  The command line syntax is:                                              *
  9. *                                                                           *
  10. *     WHERE [ starting directory ] filename.ext [p] (for file prompting)    *
  11. *                                                                           *
  12. *     Rule: if a directory name is the last item in the path name, then     *
  13. *           the directory name MUST be followed by a backslash or else it   *
  14. *           will be considered a filespec.                                  *
  15. *                                                                           *
  16. *  This program originally came from the Oct. 85 issue of PC Tech Journal.  *
  17. *  While it was written originally for the Mark Williams compiler, this     *
  18. *  version is for the Microsoft C compiler, vsn 3.0 or later.               *
  19. *                                                                           *
  20. *  George Defenbaugh,  918-622-7926,  10034 E. 29th St.  Tulsa, OK  74129   *
  21. ****************************************************************************/
  22.  
  23. /****************************************************************************
  24. *  C header files                                                           *
  25. *  These identify library routines.  LINT_ARGS must be defined first.       *
  26. ****************************************************************************/
  27.  
  28. #define LINT_ARGS = 1      /* value doesn't matter, only definition does   */
  29.  
  30. #include <conio.h>         /* for console i/o                              */
  31. #include <dos.h>           /* for DOS interrupt calls                      */
  32. #include <stdio.h>         /* for standard i/o                             */
  33. #include <string.h>        /* for string functions                         */
  34.  
  35. union REGS inregs,outregs; /* register structure for DOS calls             */
  36.  
  37. /****************************************************************************
  38. *  Structure for MS-DOS date and time fields returned by DOS functions      *
  39. *  See DOS Tech Reference for more information                              *
  40. ****************************************************************************/
  41.  
  42. struct msdos_date
  43. {
  44.    unsigned ms_sec      : 5; /* time in 2 sec. int (5 bits)             */
  45.    unsigned ms_min      : 6; /* minutes (6 bits)                        */
  46.    unsigned ms_hour     : 5; /* hours (5 bits)                          */
  47.    unsigned ms_day      : 5; /* day of the month (5 bits)               */
  48.    unsigned ms_month    : 4; /* month (4 bits)                          */
  49.    unsigned ms_year     : 7; /* year since 1980 (7 bits)                */
  50. };
  51.  
  52. /****************************************************************************
  53. *  Define the DOS Disk Transfer Area (DTA).  The structure will be filled   *
  54. *  in by DOS for interrupt 21H calls.  See DOS Tech Ref for more info       *
  55. ****************************************************************************/
  56.  
  57. struct DTA
  58. {
  59.    char     DTA_dosinfo[21];      /* reserved for DOS use               */
  60.    char     DTA_attr;             /* file attribute byte                */
  61.    struct   msdos_date DTA_date;  /* date structure from above          */
  62.    long     DTA_size;             /* file size                          */
  63.    char     DTA_filename[13];     /* file name (w/o path)               */
  64. };
  65.  
  66. /****************************************************************************
  67. *  Macros                                                                   *
  68. ****************************************************************************/
  69.  
  70. /* This macro returns the number of elements of its array argument         */
  71.  
  72. #define SIZE(x)     (sizeof(x)/sizeof(x[0]))
  73.  
  74. /****************************************************************************
  75. *  Definition of constants                                                  *
  76. ****************************************************************************/
  77.  
  78. #define not !                 /* C normally uses the ! for NOT             */
  79. #define and &                 /* C normally uses the & for AND             */
  80. #define lower_half_reg 0x00ff /* mask for anding into lower register half  */
  81. #define carry_set      0x0001 /* mask for flag register carry bit          */
  82. #define no_type        0x06   /* gets system and hidden files too          */
  83. #define directory_type 0x16   /* directory bit on, with system and hidden  */
  84. #define directory_only 0x10   /* directory bit only is on                  */
  85. #define no_more_files  18     /* DOS return code for no more files         */
  86. #define full_screen    23     /* max number of lines on a screen           */
  87. #define end_of_string  '\0'   /* C uses a binary zero for end of string    */
  88. #define backslash      '\\'   /* The backslash character                   */
  89. #define colon          '\:'   /* The colon character                       */
  90. #define stop           'n'    /* Used with the continue_pgm switch         */
  91. #define no             'n'    /* Used with the user_want_prompt switch     */
  92. #define continue       'y'    /* Used with the continue_pgm switch         */
  93. #define yes            'y'    /* Used with the user_want_prompt switch     */
  94. #define a_ronly        0x01   /* Read only file                            */
  95. #define a_hidden       0x02   /* Hidden file                               */
  96. #define a_system       0x04   /* System file                               */
  97. #define a_directory    0x10   /* Directory                                 */
  98. #define a_archive      0x20   /* Archive bit                               */
  99. #define n_directory    'd'    /* switch value if directories are prompted  */
  100. #define n_ronly        'r'    /* Read only file                            */
  101. #define n_write        'w'    /* Write allowed                             */
  102. #define n_hidden       'h'    /* Hidden file                               */
  103. #define n_visible      'v'    /* Visible file                              */
  104. #define n_system       's'    /* System file                               */
  105. #define n_user         'u'    /* User file                                 */
  106. #define n_archive      'a'    /* Archive bit                               */
  107. #define n_not_archive  'n'    /* Not archived                              */
  108.  
  109. /****************************************************************************
  110. *  The next structure and array are for analyzing the attribute bits for    *
  111. *     each file.  The structure consists of pairs of integers, the first    *
  112. *     integer in each pair is a bit mask which has the bit set that         *
  113. *     corresponds to a particular attribute for a file.  The second integer *
  114. *     is a character that is displayed if the attribute byte has the bit    *
  115. *     set that matches the mask.  The attribute bits are:                   *
  116. *                                                                           *
  117. *           a - archive bit                                                 *
  118. *           d - directory                                                   *
  119. *           h - hidden file                                                 *
  120. *           r - read only file                                              *
  121. *           s - system file                                                 *
  122. ****************************************************************************/
  123.  
  124. static  struct atr {          /* Attribute structure                       */
  125.                     char a_mask;
  126.